package com.fdb.efp.nls.service.facade;

import com.fdb.basic.framework.core.exception.PauseException;
import com.fdb.efp.loan.service.vo.LoanRepayPlanVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 还款计划
 * 
 * @description:TODO
 * @date:2018年12月29日 下午1:21:59
 * @author:cenyj
 */
public interface LoanRepayPlanService {
	int insert(LoanRepayPlanVO loanRepayPlanVO);

	// int insertSelective(LoanRepayPlanVO loanRepayPlanVO);
	int updateByPkRefNbrAndStatus(LoanRepayPlanVO loanRepayPlanVO);

	int deleteByRefNbrAndTerm(LoanRepayPlanVO loanRepayPlanVO);

	/**
	 * 同步马上 批量更改还款计划
	 * 
	 * @description:TODO
	 * @throws PauseException
	 * @throws Exception
	 * @date:2018年12月29日 下午1:21:10
	 * @author:cenyj
	 */
	public boolean batchUpdateLoanRepayPlanFromMaTxt() throws Exception;

	LoanRepayPlanVO getLoanRepayPlanByRefNbrAndMaxTerm(LoanRepayPlanVO loanRepayPlanVo);

	public List<LoanRepayPlanVO> queryAllLoanRepayPlan(LoanRepayPlanVO loanRepayPlanVo);

	List<LoanRepayPlanVO> getBankRepayPlanListByRefNbr(LoanRepayPlanVO lPlan);

	// LoanRepayPlanVO getLoanRepayPlanByRefNbrAndStatus(LoanRepayPlanVO
	// loanRepayPlanBy);
	LoanRepayPlanVO getLoanRepayPlanByRefNbrAndTerm(LoanRepayPlanVO loanRepayPlanBy);

	int updateByPkRefNbrAndTerm(LoanRepayPlanVO loanRepayPlanVO);

	public List<LoanRepayPlanVO> qryLoanRepayPlanByLoanNo(LoanRepayPlanVO loanRepayPlanVo);

	List<LoanRepayPlanVO> queryPageByRefNbr(LoanRepayPlanVO loanRepayPlanVO, Integer offset, Integer limit);

	Integer queryCountByRefNbr(LoanRepayPlanVO loanRepayPlanVO);

	public int batchInsert(List<LoanRepayPlanVO> loanRepayPlanVOList);
	/**
	 * 
	 * 通过借据号、违约标志查询还款计划信息 <br>
	 * 0.1:ludayong:2019年3月5日 下午9:56:23:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月5日 下午9:56:23
	 * @date 2019年3月5日 下午9:56:23
	 * @version 0.1
	 */
	List<LoanRepayPlanVO> queryLoanRepayPlanByLoanNoAndOverdueFlag(LoanRepayPlanVO loanRepayPlanVo);

	/**
	 * 
	 * 批量新增还款计划信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:34:07:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月11日 下午9:34:07
	 * @date 2019年3月11日 下午9:34:07
	 * @version 0.1
	 */
	public int batchInsertLoanRepayPlan(List<LoanRepayPlanVO> addList);

	/**
	 * 
	 * 批量更新还款计划信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:34:07:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月11日 下午9:34:07
	 * @date 2019年3月11日 下午9:34:07
	 * @version 0.1
	 */
	public int batchUpdateLoanRepayPlan(List<LoanRepayPlanVO> updateList);

	/**
	 * 
	 * 通过借据编号和期数更新还款计划信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:34:07:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午9:34:07
	 * @date 2019年3月20日 下午9:34:07
	 * @version 0.1
	 */
	int updateByLoanRepayPlanByRefNbrAndTerm(LoanRepayPlanVO loanRepayPlanVO);
	
	 /**
		 * 
		 * 日初借据分期计划临时表数据到分期计划表有数据则更新，无则新增 <br>
		 * 0.1:weijj:2019年5月7日 下午2:37:18:新增 <br>
		 * 
		 * @author weijj
		 * @since 2019年5月7日 下午2:37:18
		 * @date 2019年5月7日 下午2:37:18
		 * @version 0.1
		 */
		public int insertOrUpdateLoanRepayPlan(List<LoanRepayPlanVO> list);
		
		/**
	 * 更新或者插入还款计划: <br>
	 *
	 * 0.1:caoxin:2019/5/15 14:59: 更新或者插入还款计划: <br>
	 * @author caoxin
	 * @return
	 * @since 2019/5/15 14:59
	 * @date 2019/5/15 14:59
	 * @version 0.1
	 */
	int batchInsertOrUpdateLoanRepayPlan(List<LoanRepayPlanVO> LoanRepayPlanVOs);
	
	/**
	 * 开发人员：【chenxuan】
	 * 创建/修改日期：【2019/5/21】
	 * 描述：查询最小逾期期数
	 * @Param [bizDate]
	 * @return java.util.List<LoanRepayPlanVO>
	 **/
//		@author:liuty
//		@date:2019/10/17
//		涉及产品:税e贷
//		功能:查询最小逾期期数
//		原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	public List<LoanRepayPlanVO>  queryMinOverdueTerm(String bizDate);
//		@author:liuty
//		@date:2019/10/17
//		涉及产品:税e贷
//		原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//    List<LoanRepayPlanVO> queryCreditReportionData(List<String> prdInfoIds, String batchDate);
    
	/**
	 * 根据贷款账号查询逾期的还款计划: <br>
	 * 0.1:caoxin:2019/6/27 19:09: 根据贷款账号查询逾期的还款计划:<br>
	 * @author caoxin
	 * @return
	 * @since 2019/6/27 19:09
	 * @date 2019/6/27 19:09
	 * @version 0.1
	 */
    List<LoanRepayPlanVO> queryRepayPlanByRefNbrAndStatus(LoanRepayPlanVO loanRepayPlanVO);

	/**
	 * 根据批次号查询当前期数: <br>
	 * 0.1:caoxin:2019/6/27 19:09: 根据批次号查询当前期数:<br>
	 * @author caoxin
	 * @return
	 * @since 2019/6/27 19:09
	 * @date 2019/6/27 19:09
	 * @version 0.1
	 */
	Integer queryCurrentTerm(String batchDate, String billNo);

	/**
	 * 需求编号：【2019D0519】（业务提的需求编号）
	 * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
	 * 开发人员：qiuyf
	 * 创建日期：2019年7月1日 下午9:17:21
	 * 功能描述：根据借据编号删除还款计划信息
	 */
	public int deleteByLoanNo(String loanNo);

	/**
	 * 需求编号：【2019D0519】（业务提的需求编号）
	 * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
	 * 开发人员：qiuyf
	 * 创建日期：2019年7月22日 下午8:29:34
	 * 功能描述：通过借据号查询还款计划（注意：但只是查询需要的部分字段）
	 */
	public List<LoanRepayPlanVO> qryAllByLoanNo(String loanNo);
	/**
	 * 根据借据号和是否逾期过字段查询还款计划数据
	 * @param loanRepayPlanVO
	 * @return
	 */
	List<LoanRepayPlanVO> queryRepayPlanByRefNbrAndIsOverDue(LoanRepayPlanVO loanRepayPlanVO);

	/**
	 * 根据借据号列表查询所有的还款计划信息
	 * @param refNbrs 借据号列表
	 * @return
	 */
	List<LoanRepayPlanVO> queryRepayPlansByRefNbr(List<String> refNbrs);

	/**
	 * 根据产品id修复还款总期数的值
	 * @param prdId
	 * @return
	 */
	int fixInitTerm(@Param("prdId") String prdId);


	/**
	 * 需求编号：【2020D1309】（业务提的需求编号）
	 * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
	 * 开发人员：wanglaisheng
	 * 创建日期：2020年11月23日
	 * 功能描述：通过借据号查询还款计划（注意：不包含缩期部分数据）
	 */
	List<LoanRepayPlanVO> getPlanByPKWithoutCancelStatusByPage(LoanRepayPlanVO vo);
	/**
	 * 查询最小逾期的结束日期
	 * @param list 借据号集合
	 * @return
	 */
	List<LoanRepayPlanVO> queryMinOverdueStmtDates(List<String> list);

    int insertOrUpdatePsd(List<LoanRepayPlanVO> list) throws Exception;

    int insertOrUpdateYed(List<LoanRepayPlanVO> list) throws Exception;


    /**
     * 根据贷款号、状态查询还款计划
     *
     * @author xieziwei
     * @version 0.1
     */
    public List<LoanRepayPlanVO> getLoanRepayPlanByRefNbrAndStatus(LoanRepayPlanVO loanRepayPlanBy);



}
